package com.zjl.redis.第11章_redis多线程;

/**
 * redis为什么快?
 *
 * 1.基于内存操作: Redis 的所有数据都存在内存中，因此所有的运算都是内存级别的，所以他的性能比较高;
 * 2.数据结构简单: Redis 的数据结构是专门设计的，而这些简单的数据结构的查找和操作的时间大部分复杂度都是0(1),因此性能比较高;
 * 3.多路复用和非阻塞I/O: Redis使用 I/O多路复用功能来监听多个socket连接客户端，
 *      这样就可以使用一个线程连接来处理多个请求，减少线程切换带来的开销，同时也避兔了I/O阻塞操作
 * 4.避免上下文切换: 因为是单线程模型，因此就避免了不必要的上下文切换和多线程竞争,
 *      这就省去了多线程切换带来的时间和性能上的消耗，而且单线程不会导致死锁问题的发生
 *
 *
 * CPU并不是您使用Redis的瓶颈，因为通常Redis要么受内存限制，要么受网络限制。
 * 例如，使用在平均Linux系统上运行的流水线Redis每秒可以发送一百万个请求，
 * 因此，如果您的应用程序主要使用 O(N) 或 O(log(N))命令,则几乎不会使用过多的CPU.
 * 但是，为了最大程度地利用CPU,您可以在同一框中启动多个Redis实例，并将它们视为不同的服务器。
 * 在某个时候，单个盒子可能还不够,因此,如果您要使用多个CPU,则可以开始考虑更早地进行分片的某种方法。
 *
 *
 * 在Redis6/7中， 非常受关注的第一个新特性就是多线程。
 * ●这是因为，Redis一直被大家熟知的就是它的单线程架构，虽然有些命令操作可以用后台线程或子进程执行(比如数据删除、快照生成、AOF重写)
 *  但是，从网络IO处理到实际的读写命令处理，都是由单个线程完成的。
 * ●随着网络硬件的性能提升，Redis的性能瓶颈有时会出现在网络IO的处理上，
 *      也就是说，单个主线程处理网络请求的速度跟不上底层网络硬件的速度
 * ●为了应对这个问题:
 *      采用多个IO线程来处理网络请求，提高网络请求处理的并行度，Redis6/ 7就是采用的这种方法。
 * ●但是，Redis的多IO线程只是用来处理网络请求的，对于读写操作命令Redis仍然使用单线程来处理。
 *  这是因为，Redis处理请求时，网络处理经常是瓶颈，通过多个IO线程并行处理网络操作，可以提升实例的整体处理性能。
 *  而继续使用单线程执行命令操作，就不用为了保证Lua脚本、事务的原子性，额外开发多线程互斥加锁机制了(不管加锁操作处理)，
 *  这样一来，Redis线程模型实现就简单了
 *
 */
public class B_redis速度快的原因 {
}
